
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<?php
require_once LIBRARIES_ENTITIES_DATABASE;
require_once LIBRARIES_ENTITIES_FIELDS;
require_once LIBRARIES_ENTITIES_UNITS;
require_once LIBRARIES_ENTITIES_UNITTYPES;
require_once LIBRARIES_ENTITIES_PROCEDURES;

require_once LIBRARIES_TOOLS_UTILITY;
require_once LIBRARIES_TOOLS_XTEMPLATE;
require_once LIBRARIES_TOOLS_PAGERBACKEND;

class ProcedureComponent {

    //put your code here
    public function invoke() {

        // kiểm tra session
        if ($_SESSION["session"]["key"] == "Supper Administrator" || $_SESSION["session"]["key"] == "Administrator" || $_SESSION["session"]["key"] == "Editor") {

            // biến lưu giá trị hiển thị
            $view = '';
            if (isset($_GET['view'])) {
                $view = $_GET['view'];
            }

            // hành động
            $action = '';
            if (isset($_POST['hdAction'])) {
                $action = $_POST['hdAction'];
            }


            // tác vụ
            $task = '';
            if (isset($_GET['task'])) {
                $task = $_GET['task'];
            }

            // tổng số dòng muốn hiển thị
            $rowToView = 10;
            if (isset($_POST["limit"])) {
                $rowToView = $_POST["limit"];
            }



            // kiểm tra giá trị biến view
            // nếu là 'article' thì sẽ hiển thị trang danh sách bài viết
            if ($view == 'procedure') {

                // nổi bật
                if ($action == 'orderdown') {
                    $articleID = $_POST["hdArticleID"];
                    $result = $this->orderDownArticle($articleID);
                }
                // bỏ nổi bật
                else if ($action == 'orderup') {
                    $articleID = $_POST["hdArticleID"];
                    $result = $this->orderUpArticle($articleID);
                }
                // xóa bài viết
                if ($action == 'remove') {

                    // mảng danh sách giá trị id
                    $values = $_POST["cid"];

                    $result = $this->deleteProcedureByID($values);
                    if ($result == OK) {
                        Utility::messageBox('Xóa thành công');
                    }
                } else if ($action == 'add' || $action == 'addAndExit') {

                    $title = $_POST['txtTitle'];
                    $alias = Utility::removeSigns($_POST['txtAlias']);
                    $description = Utility::replaceHtmlSpecialChars($_POST['txtDescription']);
                    $content = Utility::replaceHtmlSpecialChars($_POST['txtContent']);
                    $modifiedDate = Utility::formatDateTime($_POST['createdDate']);
                    $image = $_POST['hdImage'];
                    $imageStatus = $_POST['rdoImageStatus'];

                    $field = $_POST['slField'];
                    $unitType = $_POST['slUnitType'];
                    $unit = $_POST['slUnit'];

                    if ($unit == 0) {
                        $unit = null;
                    }

                    $status = $_POST['rdoStatus'];

                    $modifiedUserID = $_SESSION["session"]["userAccountID"];

                    $result = $this->addProcedure($title, $alias, $modifiedDate, $image, $imageStatus, $description, $content, $modifiedUserID, $status, $unitType, $unit, $field);

                    if ($result == OK) {
                        if ($action == 'add') {
                            Utility::messageBox('Thêm thành công');
                        } else {
                            Utility::redirect(".?com=com_procedure&view=procedure&task=view");
                        }
                    }
                } else if ($action == 'edit' || $action == 'editAndExit') {

                    $ID = $_POST['hdID'];
                    $title = $_POST['txtTitle'];
                    $alias = Utility::removeSigns($_POST['txtAlias']);
                    $description = Utility::replaceHtmlSpecialChars($_POST['txtDescription']);
                    $content = Utility::replaceHtmlSpecialChars($_POST['txtContent']);
                    $modifiedDate = Utility::formatDateTime($_POST['createdDate']);
                    $image = $_POST['hdImage'];
                    $imageStatus = $_POST['rdoImageStatus'];

                    $field = $_POST['slField'];

                    $unitType = $_POST['slUnitType'];

                    $unit = $_POST['slUnit'];

                    if ($unit == 0) {
                        $unit = null;
                    }

                    $status = $_POST['rdoStatus'];

                    $modifiedUserID = $_SESSION["session"]["userAccountID"];

                    $result = $this->updateProcedure($ID, $title, $alias, $modifiedDate, $image, $imageStatus, $description, $content, $modifiedUserID, $status, $unitType, $unit, $field);

                    if ($result == OK) {
                        if ($action == 'edit') {
                            Utility::messageBox('Cập nhật thành công');
                        } else {
                            Utility::redirect(".?com=com_procedure&view=procedure&task=view");
                        }
                    }
                }




                if ($task == 'view') {

                    $dir = dirname(__FILE__);
                    $viewFile = ADMIN_COM . DS . 'com_procedure' . DS . 'views' . DS . 'procedure_list.html';

                    $xtemplate = new XTemplate($viewFile);

                    $this->printFieldList($xtemplate);
                    $this->printUnitList($xtemplate);
                    $this->printUnitTypeList($xtemplate);




                    // chỉ mục của checkbox
                    $indexCheckBox = 1;

                    // page hiện tại đang xem
                    $rurrentPage = 1;
                    if (isset($_POST["page"])) {
                        $rurrentPage = $_POST["page"];
                    }

                    // chỉ mục (số thứ tự của bài viết) bài viết
                    $index = 1;

                    $unitType = '';
                    $fieldID = 0;
                    $unitID = 0;

                    if (isset($_POST['slUnitType'])) {
                        $unitType = $_POST['slUnitType'];
                    }
                    if (isset($_POST['slField'])) {
                        $fieldID = $_POST['slField'];
                    }
                    if (isset($_POST['slUnit'])) {
                        $unitID = $_POST['slUnit'];
                    }

                    // tải danh sách bài viết
                    $procedures = $this->getProcedureList($unitType, $fieldID, $unitID);


                    // tải đối tượng phân trang
                    $pager = PagerBackEnd::getPagerData(count($procedures), $rowToView, $rurrentPage);


                    if ($procedures != null) {

                        $indexCheckBox = 1;
                        // in danh sách bài viết
                        foreach ($procedures as $procedure) {

                            if ($index > $pager->offset && $index <= $pager->limit) {

                                $xtemplate->assign('INDEX', $index);

                                $xtemplate->assign('INDEX_CHECKBOX', $indexCheckBox);

                                $xtemplate->assign('RROCEDURE_ID', $procedure->getID());
                                $xtemplate->assign('RROCEDURE_NAME', $procedure->getTitle());
                                $xtemplate->assign('CREATED_USER', $procedure->getCreatedUser()->getFullname());
                                $xtemplate->assign('CREATED_DATE', Utility::formatDateTimeToView($procedure->getCreatedDate()));
                                $xtemplate->assign('MODIFIED_DATE', Utility::formatDateTimeToView($procedure->getModifiedDate()));
                                $xtemplate->assign('FIELD_NAME', $procedure->getField()->getName());
                                $xtemplate->assign('UNIT_TYPE', $procedure->getUnitTypeName());

                                if ($procedure->getUnit() != null) {
                                    $xtemplate->assign('UNIT', $procedure->getUnit()->getName());
                                }

                                // nếu là dòng đầu thì hiển thị mũi tên xuống
//                                if ($index == 1) {
//                                    $xtemplate->parse('main.procedure_list.down_arrow');
//                                }
//                                // nếu là dòng cuối thì hiển thị mũi tên lên
//                                else if ($index == count($procedures)) {
//                                    $xtemplate->parse('main.procedure_list.up_arrow');
//                                }
//                                // ngược lại thì hiển thị cả 2 mũi tên
//                                else {
//                                    $xtemplate->parse('main.procedure_list.up_down_arrow');
//                                }

                                $xtemplate->parse('main.procedure_list');

                                $indexCheckBox++;
                            }
                            $index++;
                        }
                    }

                    // danh sách chọn số dòng hiển thị
                    $xtemplate->assign('LIMIT_LIST', Utility::getLimitList($rowToView));

                    // tổng số dòng hiển thị
                    $xtemplate->assign('ROW_TO_VIEW', $rowToView);

                    // trang hiện tại
                    $xtemplate->assign('CURRENT_PAGE', $rurrentPage);

                    // tổng số trang có được
                    $xtemplate->assign('AMOUNT_OF_PAGE', $pager->numPages);

                    // định dạng phân trang html
                    $xtemplate->assign('PAGING_HTML', $pager->paging);


                    $xtemplate->parse('main');
                    $xtemplate->out('main');
                }
                // nếu task là add thì include trang thêm vào
                else if ($task == 'add') {

                    $dir = dirname(__FILE__);
                    $xtemplate = new XTemplate($dir . '/views/procedure_add.html');

                    $this->printFieldList($xtemplate);
                    $this->printUnitList($xtemplate);
                    $this->printUnitTypeList($xtemplate);


                    $xtemplate->assign('TODAY', date('d/m/Y'));
                    $xtemplate->assign('UPLOAD_FOLDER', UPLOAD_FOLDER);
                    $xtemplate->parse('main');
                    $xtemplate->out('main');
                }

                // nếu task là edit thì include trang thêm vào
                else if ($task == 'edit') {


                    $procedureID = '';

                    if (isset($_GET['procedureID'])) {
                        $procedureID = $_GET['procedureID'];
                    }

                    $procedure = $this->getProcedureByID($procedureID);



                    // nếu có tồn tại bài viết có mã như trên thì hiển thị
                    // ngược lại quay về trang danh sách
                    if ($procedure != null) {

                        $xtemplate = new XTemplate(ADMIN_COM . DS . 'com_procedure' . DS . 'views' . DS . 'procedure_edit.html');

                        $this->printFieldList($xtemplate, $procedure->getFieldID());
                        $this->printUnitList($xtemplate, $procedure->getUnitID());
                        $this->printUnitTypeList($xtemplate, $procedure->getUnitTypeName());


                        $xtemplate->assign('MODIFIED_DATE', Utility::formatDateTimeToView($procedure->getModifiedDate()));


                        $xtemplate->assign('TITLE', $procedure->getTitle());


                        $xtemplate->assign('IMAGE', $procedure->getImage());

                        // alias
                        $xtemplate->assign('ALIAS', $procedure->getAlias());

                        // mô tả
                        $xtemplate->assign('DESCRIPTION', $procedure->getDescription());

                        // nội dung
                        $xtemplate->assign('CONTENT', $procedure->getContent());



                        $xtemplate->assign('PROCEDURE_ID', $procedure->getID());


                        if ($procedure->getImageStatus() == 1) {
                            $xtemplate->parse('main.image_status_true');
                        } else {
                            $xtemplate->parse('main.image_status_false');
                        }

                        // trạng thái bài viết
                        if ($procedure->getStatus() == 1) {
                            $xtemplate->parse('main.status_true');
                        } else {
                            $xtemplate->parse('main.status_false');
                        }


                        $xtemplate->parse('main');
                        $xtemplate->out('main');
                    } else {
                        Utility::redirect('.?com=com_procedure&view=procedure&task=view');
                    }
                }
            }
        }
    }

    private function getUnitList() {
        $db = new Database();
        try {
            $unit = new Units();
            $result = $unit->getList($db);
            $db->submitChanges($db);
            return $result;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    private function getUnitTypeList() {
        $db = new Database();
        try {
            $unitType = new UnitTypes();
            $result = $unitType->getList($db);
            $db->submitChanges($db);
            return $result;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    private function getProcedureList($unitType, $fieldID, $unitID) {
        $db = new Database();
        try {
            $procedure = new Procedures();

            $procedure->setUnitTypeName($unitType);
            $procedure->setFieldID($fieldID);
            $procedure->setUnitID($unitID);

            $result = $procedure->getList($db);
            $db->submitChanges($db);
            return $result;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    private function getFieldList() {
        $db = new Database();
        try {
            $field = new Fields();
            $result = $field->getList($db);
            $db->submitChanges($db);
            return $result;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
        }
    }

    // in ra danh sách category
    private function printFieldList($xtemplate, $parentID = null) {

        // tải danh sách nhóm tin
        $fields = $this->getFieldList();

        // in ra danh sách chủ đề bài viết
        foreach ($fields as $field) {


            $xtemplate->assign('FIELD_ID', $field->getID());
            $xtemplate->assign('FIELD_NAME', $field->getName());

            if ($parentID != null) {
                if ($parentID == $field->getID()) {
                    $xtemplate->assign('SELECTED_FIELD', 'selected');
                } else {
                    $xtemplate->assign('SELECTED_FIELD', '');
                }
            } else {
                if (isset($_POST['slField'])) {
                    // nếu có biến post categoryID 
                    // (tức là có chọn thì hiển thị lại cái đã chọn trong danh sách)
                    if ($_POST['slField'] == $field->getID()) {
                        $xtemplate->assign('SELECTED_FIELD', 'selected');
                    } else {
                        $xtemplate->assign('SELECTED_FIELD', '');
                    }
                } else if (isset($_GET['fieldID'])) {
                    // nếu có biến get categoryID 
                    // (tức là từ form thêm hay form edit trả về)
                    if ($_GET['fieldID'] == $field->getID()) {
                        $xtemplate->assign('SELECTED_FIELD', 'selected');
                    } else {
                        $xtemplate->assign('SELECTED_FIELD', '');
                    }
                } else {
                    $xtemplate->assign('SELECTED_FIELD', '');
                }
            }

            $xtemplate->parse('main.field_list');
        }
    }

    private function printUnitList($xtemplate, $parentID = null) {

        // tải danh sách nhóm tin
        $units = $this->getUnitList();

        if (count($units) > 0) {

            foreach ($units as $unit) {

                $xtemplate->assign('UNIT_ID', $unit->getID());
                $xtemplate->assign('UNIT_NAME', $unit->getName());

                if ($parentID != null) {
                    // nếu có biến get categoryID 
                    // (tức là từ form thêm hay form edit trả về)
                    if ($parentID == $unit->getID()) {
                        $xtemplate->assign('SELECTED_UNIT', 'selected');
                    } else {
                        $xtemplate->assign('SELECTED_UNIT', '');
                    }
                } else {
                    if (isset($_POST['slUnit'])) {
                        // nếu có biến post categoryID 
                        // (tức là có chọn thì hiển thị lại cái đã chọn trong danh sách)
                        if ($_POST['slUnit'] == $unit->getID()) {
                            $xtemplate->assign('SELECTED_UNIT', 'selected');
                        } else {
                            $xtemplate->assign('SELECTED_UNIT', '');
                        }
                    } else if (isset($_GET['unitID'])) {
                        // nếu có biến get categoryID 
                        // (tức là từ form thêm hay form edit trả về)
                        if ($_GET['unitID'] == $unit->getID()) {
                            $xtemplate->assign('SELECTED_UNIT', 'selected');
                        } else {
                            $xtemplate->assign('SELECTED_UNIT', '');
                        }
                    } else {
                        $xtemplate->assign('SELECTED_UNIT', '');
                    }
                }

                $xtemplate->parse('main.unit_list');
            }
        }
    }

    private function printUnitTypeList($xtemplate, $parentID = null) {


        $unitTypes = $this->getUnitTypeList();

        if (count($unitTypes) > 0) {

            foreach ($unitTypes as $unitType) {

                $xtemplate->assign('UNITTYPE', $unitType->getName());

                if ($parentID != null) {
                    // nếu có biến get categoryID 
                    // (tức là từ form thêm hay form edit trả về)
                    if ($parentID == $unitType->getName()) {
                        $xtemplate->assign('SELECTED_UNITTYPE', 'selected');
                    } else {
                        $xtemplate->assign('SELECTED_UNITTYPE', '');
                    }
                } else {
                    if (isset($_POST['slUnitType'])) {
                        // nếu có biến post categoryID 
                        // (tức là có chọn thì hiển thị lại cái đã chọn trong danh sách)
                        if ($_POST['slUnitType'] == $unitType->getName()) {
                            $xtemplate->assign('SELECTED_UNITTYPE', 'selected');
                        } else {
                            $xtemplate->assign('SELECTED_UNITTYPE', '');
                        }
                    } else if (isset($_GET['unitType'])) {
                        // nếu có biến get categoryID 
                        // (tức là từ form thêm hay form edit trả về)
                        if ($_GET['unitType'] == $unitType->getName()) {
                            $xtemplate->assign('SELECTED_UNITTYPE', 'selected');
                        } else {
                            $xtemplate->assign('SELECTED_UNITTYPE', '');
                        }
                    } else {
                        $xtemplate->assign('SELECTED_UNITTYPE', '');
                    }
                }

                $xtemplate->parse('main.unitType_list');
            }
        }
    }

    private function addProcedure($title, $alias, $createdDate, $image, $imageStatus, $description, $content, $createdUserID, $status, $unitType, $unit, $field) {
        $db = new Database();
        try {

            $procedure = new Procedures();

            $procedure->setTitle($title);
            $procedure->setAlias($alias);
            $procedure->setCreatedDate($createdDate);
            $procedure->setModifiedDate($createdDate);
            $procedure->setCreatedUserID($createdUserID);
            $procedure->setModifiedUserID($createdUserID);
            $procedure->setImage($image);
            $procedure->setImageStatus($imageStatus);
            $procedure->setDescription($description);
            $procedure->setContent($content);

            $procedure->setHits(0);
            $procedure->setStatus($status);
            $procedure->setOrder($procedure->getMaxOrder($db));


            $procedure->setFieldID($field);
            $procedure->setUnitTypeName($unitType);
            $procedure->setUnitID($unit);

            $procedure->add($db);
            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    private function updateProcedure($ID, $title, $alias, $createdDate, $image, $imageStatus, $description, $content, $createdUserID, $status, $unitType, $unit, $field) {
        $db = new Database();
        try {

            $procedure = new Procedures();

            $procedure->setID($ID);
            $procedure->setTitle($title);
            $procedure->setAlias($alias);
            $procedure->setModifiedDate($createdDate);
            $procedure->setModifiedUserID($createdUserID);
            $procedure->setImage($image);
            $procedure->setImageStatus($imageStatus);
            $procedure->setDescription($description);
            $procedure->setContent($content);


            $procedure->setStatus($status);



            $procedure->setFieldID($field);
            $procedure->setUnitTypeName($unitType);
            $procedure->setUnitID($unit);

            $procedure->update($db);

            $db->submitChanges();

            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }
    }

    private function deleteProcedureByID($values) {
        $db = new Database();
        try {

            for ($i = 0; $i < count($values); $i++) {
                $procedure = new Procedures();
                $procedure->setID($values[$i]);
                $procedure->delete($db);
            }

            $db->submitChanges();
            return OK;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            $db->rollback();
            exit();
        }
    }

    private function getProcedureByID($procedureID) {
        $db = new Database();
        try {
            $procedure = new Procedures();
            $procedure->setID($procedureID);
            $procedure = $procedure->getByID($db);
            $db->submitChanges();
            return $procedure;
        } catch (PDOException $exc) {
            echo $exc->getMessage();
            $db->rollback();
            exit();
        }
    }

}
?>
